package client.subsistema1;

import beans.*;
import common.EOlympicsException;
import common.RemoteInterface;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

/**
 *
 * @author Albert
 */
public class PantallaAdministracioUsuaris extends javax.swing.JFrame {
    private PantallaBusquedaUsuarios pantallaBusqueda;
    private RemoteInterface remoto;
    private Administrador administrador;
    private Usuari usuari;
    private Vector inscripcions;
    private Vector proves;
    private Vector rondes;
    private Vector participacions;
    private List<String> universitats;
    private int estat; //0 inici, 1 detall bloquejat, 2 editant, 3 creant nou
    private java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("i18n/subsistema1/messagesSubsistema1");
    
    /**
     * Creates new form PantallaAdministracioUsuaris<br>
     * Omple la llista d'universitats i actualitza els menus en l'estat inicial
     * @param pRemoto Objecte remot que utilitzarà tota la classe per fer les consultes al servidor
     * @param pAdministrador usuari administrador que farà totes les gestions
     */
    public PantallaAdministracioUsuaris(RemoteInterface pRemoto, Administrador pAdministrador) {
        remoto = pRemoto;
        administrador = pAdministrador;
        
        initComponents();
        // center the jframe on screen
        this.setLocationRelativeTo(null);
        
        universitats = new ArrayList<String>();
        
        Properties prop = new Properties();
        final String propertiesFile = new File("").getAbsolutePath() + "/properties/generalVars.properties";
        try {
            prop.load(new FileInputStream(propertiesFile));
            
            String universitatsStr = prop.getProperty("universitats");
        
            String[] unis = universitatsStr.split(",");
            for(int i = 0; i<unis.length; i++){
                universitats.add(unis[i]);
            }
        } catch (IOException ex) {
                Logger.getLogger(PantallaAdministracioUsuaris.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
        fillComboUniversitats();
        
        updateMenusWithState();
        clearAll();
        disableAll();
    }
    
    /**
     * Seteja la disponibilitat dels menus depenent del valor de la variable estat 
     */
    private void updateMenusWithState(){
        switch(estat){
            case 0:
                menuNou.setEnabled(true);
                menuTancar.setEnabled(true);
                menuEditar.setEnabled(false);
                menuGuardar.setEnabled(false);
                menuEliminar.setEnabled(false);
                menuBuscar.setEnabled(true);
                break;
            case 1:
                menuNou.setEnabled(true);
                menuTancar.setEnabled(true);
                menuEditar.setEnabled(true);
                menuGuardar.setEnabled(false);
                menuEliminar.setEnabled(true);
                menuBuscar.setEnabled(true);
                break;
            case 2:
                menuNou.setEnabled(true);
                menuTancar.setEnabled(true);
                menuEditar.setEnabled(false);
                menuGuardar.setEnabled(true);
                menuEliminar.setEnabled(false);
                menuBuscar.setEnabled(true);
                break;
            case 3:
                menuNou.setEnabled(true);
                menuTancar.setEnabled(true);
                menuEditar.setEnabled(false);
                menuGuardar.setEnabled(true);
                menuEliminar.setEnabled(false);
                menuBuscar.setEnabled(true);
                break;
            default:
                break;
        }
    }
    
    /**
     * Omple el ComboBox de les universitats
     */
    private void fillComboUniversitats(){
        comboUniversitat.removeAllItems();
        
        comboUniversitat.addItem("Sel·leccioneu una Universitat...");
        
        Iterator<String> it = universitats.iterator();
        while(it.hasNext()){
            String universitat = it.next();
            comboUniversitat.addItem(universitat);
        }
    }
    
    /**
     * Depenent de l'estat de la pantalla i de l'opció seleccionada al ComboBox de funcions<br>
     * habilita o deshabilita el ComboBox de les universitats 
     */
    private void checkUniversitatsEnabled(){
        if(estat==2 || estat==3){
            if(comboFuncions.getSelectedIndex()!=3){
                comboUniversitat.setEnabled(false);
                comboUniversitat.setSelectedIndex(0);
            }else{
                comboUniversitat.setEnabled(true);
            }
        }
    }

    /**
     * Habilit tot el formulari per la seva edició
     */
    private void enableAll(){
        fieldCognom1.setEnabled(true);
        fieldCognom2.setEnabled(true);
        fieldContrasenya.setEnabled(true);
        fieldDocument.setEnabled(true);
        fieldEmail.setEnabled(true);
        //fieldIdentificador.setEnabled(true);
        fieldNom.setEnabled(true);
        fieldUsuari.setEnabled(true);
        fieldVerificarContrasenya.setEnabled(true);
        checkActiu.setEnabled(true);
        checkBloquejat.setEnabled(true);
        comboDocuments.setEnabled(true);
        comboFuncions.setEnabled(true);
        comboUniversitat.setEnabled(true);
        
        checkUniversitatsEnabled();
    }
    
    /**
     * Deshabilita tots els camps del formulari per evitar la seva modificació
     */
    private void disableAll(){
        fieldCognom1.setEnabled(false);
        fieldCognom2.setEnabled(false);
        fieldContrasenya.setEnabled(false);
        fieldDocument.setEnabled(false);
        fieldEmail.setEnabled(false);
        fieldIdentificador.setEnabled(false);
        fieldNom.setEnabled(false);
        fieldUsuari.setEnabled(false);
        fieldVerificarContrasenya.setEnabled(false);
        checkActiu.setEnabled(false);
        checkBloquejat.setEnabled(false);
        comboDocuments.setEnabled(false);
        comboFuncions.setEnabled(false);
        comboUniversitat.setEnabled(false);
    }
    
    /**
     * Neteja tot el formulari per la seva edició de nou
     */
    private void clearAll(){
        fieldCognom1.setText("");
        fieldCognom2.setText("");
        fieldContrasenya.setText("");
        fieldDocument.setText("");
        fieldEmail.setText("");
        fieldIdentificador.setText("");
        fieldNom.setText("");
        fieldUsuari.setText("");
        fieldVerificarContrasenya.setText("");
        checkActiu.setSelected(true);
        checkBloquejat.setSelected(false);
        comboDocuments.setSelectedIndex(0);
        comboFuncions.setSelectedIndex(0);
        comboUniversitat.setSelectedIndex(0);
        
        taulaDates.removeAll();
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("Alta");
        model.addColumn("Modificació");
        model.addColumn("Baixa");
        taulaDates.setModel(model);
        
        tableProvesInscrites.removeAll();
        DefaultTableModel model2 = new DefaultTableModel();
        model2.addColumn("Prova");
        model2.addColumn("Data");
        model2.addColumn("Realitzada");
        tableProvesInscrites.setModel(model2);
    }
    
    /**
     * Omple el formulari amb els valors de l'usuari seleccionat
     */
    private void fillFormWithCurrentUser(){
        fieldIdentificador.setText(""+usuari.getIdIntern());
        fieldDocument.setText(usuari.getDocument());
        
        System.out.println("Tipus de document: _"+usuari.getTipusDocumentId()+"_");
        if(usuari.getTipusDocumentId().equals("NIF")){
            comboDocuments.setSelectedIndex(1);
        }else if(usuari.getTipusDocumentId().equals("NIE")){
            comboDocuments.setSelectedIndex(2);
        }else if(usuari.getTipusDocumentId().equals("ALT")){
            comboDocuments.setSelectedIndex(3);
        }
        fieldNom.setText(usuari.getNom());
        fieldCognom1.setText(usuari.getCognom1());
        fieldCognom2.setText(usuari.getCognom2());
        if(usuari.getTipusUsuari().equalsIgnoreCase("A")){
            comboFuncions.setSelectedIndex(1);
        }else if(usuari.getTipusUsuari().equalsIgnoreCase("R")){
            comboFuncions.setSelectedIndex(2);
        }else if(usuari.getTipusUsuari().equalsIgnoreCase("E")){
            comboFuncions.setSelectedIndex(3);
        }
        fieldUsuari.setText(usuari.getIdUsuari());
        fieldContrasenya.setText(usuari.getPwd());
        fieldVerificarContrasenya.setText(usuari.getPwd());
        fieldEmail.setText(usuari.getEmail());
        
        if(usuari.getEstatEnSistema().equalsIgnoreCase("A")){
            checkActiu.setSelected(true);
            checkBloquejat.setSelected(false);
        }else if(usuari.getEstatEnSistema().equalsIgnoreCase("B")){
            checkActiu.setSelected(false);
            checkBloquejat.setSelected(true);
        }
        
        if(usuari.getTipusUsuari().equalsIgnoreCase("E")){
            Estudiant estudiant = (Estudiant)usuari;
            if(universitats.contains(estudiant.getUniversitat())){
                comboUniversitat.setSelectedIndex(universitats.indexOf(estudiant.getUniversitat())+1);
            }else{
                comboUniversitat.setSelectedIndex(0);
            }
        }else{
                comboUniversitat.setSelectedIndex(0);
        }
        
        taulaDates.removeAll();
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("Alta");
        model.addColumn("Modificació");
        model.addColumn("Baixa");
        String[] resumenCols = {(usuari.getDataAlta()!=null)?usuari.getDataAlta().toString():"-",(usuari.getDataMod()!=null)?usuari.getDataMod().toString():"-",(usuari.getDataBaixa()!=null)?usuari.getDataBaixa().toString():"-"};
        model.addRow(resumenCols);
        taulaDates.setModel(model);
        
        
        tableProvesInscrites.removeAll();
        DefaultTableModel model2 = new DefaultTableModel();
        model2.addColumn("Prova");
        model2.addColumn("Data");
        model2.addColumn("Realitzada");
        
        Iterator<Ronda> it = rondes.iterator();
        while(it.hasNext()){
            Ronda ronda = it.next();
            Vector vector = new Vector();
            
            Iterator<Prova> itp = proves.iterator();
            while(itp.hasNext()){
                Prova prova = itp.next();
                System.out.println("Prova id: "+prova.getIdProva());
                System.out.println("Ronda id: "+ronda.getIdProva());
                if(prova.getIdProva().equals(ronda.getIdProva())) {
                    System.out.println("Prova equals");
                    if(ronda.getTipusRonda().equals("E")){
                        vector.add(prova.getDescripcio()+" (Eliminatoria)");
                    }else{
                        vector.add(prova.getDescripcio()+" (Final)");
                    }
                    break;
                }
            }
            
            vector.add(ronda.getDataIniciRealitzacio().toString());
            
            boolean found = false;
            Iterator<Participacio> itpart = participacions.iterator();
            while(itpart.hasNext()){
                Participacio participacio = itpart.next();
                System.out.println("Participacio id: "+participacio.getIdProva()+" tipus ronda: "+participacio.getTipusRonda());
                if(participacio.getIdProva().equals(ronda.getIdProva()) && participacio.getTipusRonda().equals(ronda.getTipusRonda())) {
                    found = true;
                }
            }
            if(found) vector.add("Sí");
            else vector.add("No");
            
            model2.addRow(vector);
        }
        tableProvesInscrites.setModel(model2);
        
        TableColumn hdr2 = tableProvesInscrites.getTableHeader().getColumnModel().getColumn(1);
        hdr2.setPreferredWidth((int)(tableProvesInscrites.getSize().width*0.19));
        hdr2.setMaxWidth((int)(tableProvesInscrites.getSize().width*0.19));
        hdr2.setMinWidth((int)(tableProvesInscrites.getSize().width*0.19));
        hdr2.setWidth((int)(tableProvesInscrites.getSize().width*0.19));
        
        TableColumn hdr3 = tableProvesInscrites.getTableHeader().getColumnModel().getColumn(2);
        hdr3.setPreferredWidth((int)(tableProvesInscrites.getSize().width*0.15));
        hdr3.setMaxWidth((int)(tableProvesInscrites.getSize().width*0.15));
        hdr3.setMinWidth((int)(tableProvesInscrites.getSize().width*0.15));
        hdr3.setWidth((int)(tableProvesInscrites.getSize().width*0.15));
    }
    
    /**
     * Mètode de retorn de la pantalla de búsqueda<br>
     * @param pUsuari usuari seleccionat per la pantalla de búsqueda
     */
    public void pantallaBusquedaDidSelectUser(Usuari pUsuari){
        try{
            
                pantallaBusqueda.dispose();
                
                System.out.println("\nCapturando usuario...");
                usuari = remoto.sub1getUser(pUsuari.getIdIntern().intValue());
                if(usuari==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                
                inscripcions = remoto.sub1getInscripcions(usuari.getIdIntern().intValue());
                if(inscripcions==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                proves = remoto.sub1getProves(usuari.getIdIntern().intValue());
                if(proves==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                rondes = remoto.sub1getRondes(usuari.getIdIntern().intValue());
                if(rondes==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                participacions = remoto.sub1getParticipacions(usuari.getIdIntern().intValue());
                if(participacions==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                
                System.out.println("\nUsuari loguejat: "+usuari);
                
                System.out.println("\nTipus usuari: "+usuari.getTipusUsuari());
                
                System.out.println("\nId intern: "+usuari.getIdIntern());
                System.out.println("\nId usuari: "+usuari.getIdUsuari());
                System.out.println("\nPassword: "+usuari.getPwd());
                System.out.println("\nTipus de document: "+usuari.getTipusDocumentId());
                System.out.println("\nDocument: "+usuari.getDocument());
                System.out.println("\nEmail: "+usuari.getEmail());
                System.out.println("\nEstat en el sistema: "+usuari.getEstatEnSistema());
                System.out.println("\nData alta: "+usuari.getDataAlta());
                System.out.println("\nData baixa: "+usuari.getDataBaixa());
                System.out.println("\nData modificacio: "+usuari.getDataMod());
                System.out.println("\nUsuari alta: "+usuari.getUsuariAlta());
                System.out.println("\nUsuari baixa: "+usuari.getUsuariBaixa());
                System.out.println("\nUsuari modificacio: "+usuari.getUsuariMod());
                
                if(usuari.getTipusUsuari().equalsIgnoreCase("A")){
                    Administrador administrador0 = (Administrador)usuari;
                    System.out.println("\nId administrador: "+administrador0.getIdAdministrador());
                    
                }else if(usuari.getTipusUsuari().equalsIgnoreCase("R")){
                    ResponsableEvents responsable = (ResponsableEvents)usuari;
                    System.out.println("\nId responsable events: "+responsable.getIdResponsable());
                }else if(usuari.getTipusUsuari().equalsIgnoreCase("E")){
                    Estudiant estudiant = (Estudiant)usuari;
                    System.out.println("\nId estudiant: "+estudiant.getIdEstudiant());
                    System.out.println("\nUniversitat: "+estudiant.getUniversitat());
                }
                
                disableAll();
                estat = 1;
                updateMenusWithState();
                
                fillFormWithCurrentUser();
                
        }catch (EOlympicsException e) {
                System.out.println("EOlympicsException");
                JOptionPane.showMessageDialog(rootPane, e.getMessage(),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (RemoteException e) {
                System.out.println("Remote Exception");
                JOptionPane.showMessageDialog(rootPane, bundle.getString("client.error_rmi"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (Exception e){
                System.out.println("Exception");
                JOptionPane.showMessageDialog(rootPane, bundle.getString("client.administracio.error_get_user"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        labelIdentificador = new javax.swing.JLabel();
        labelDocument = new javax.swing.JLabel();
        labelTipusDocument = new javax.swing.JLabel();
        labelNom = new javax.swing.JLabel();
        labelCognom1 = new javax.swing.JLabel();
        labelFuncio = new javax.swing.JLabel();
        labelUsuari = new javax.swing.JLabel();
        labelContrasenya = new javax.swing.JLabel();
        labelVerificarContrasenya = new javax.swing.JLabel();
        labelEmail = new javax.swing.JLabel();
        labelUniversitat = new javax.swing.JLabel();
        fieldIdentificador = new javax.swing.JTextField();
        fieldDocument = new javax.swing.JTextField();
        comboDocuments = new javax.swing.JComboBox();
        fieldNom = new javax.swing.JTextField();
        fieldCognom1 = new javax.swing.JTextField();
        fieldCognom2 = new javax.swing.JTextField();
        comboFuncions = new javax.swing.JComboBox();
        fieldUsuari = new javax.swing.JTextField();
        fieldContrasenya = new javax.swing.JTextField();
        fieldVerificarContrasenya = new javax.swing.JTextField();
        fieldEmail = new javax.swing.JTextField();
        comboUniversitat = new javax.swing.JComboBox();
        checkBloquejat = new javax.swing.JCheckBox();
        checkActiu = new javax.swing.JCheckBox();
        jScrollPane1 = new javax.swing.JScrollPane();
        taulaDates = new javax.swing.JTable();
        jScrollPane2 = new javax.swing.JScrollPane();
        tableProvesInscrites = new javax.swing.JTable();
        labelProvesInscrites = new javax.swing.JLabel();
        labelCognom2 = new javax.swing.JLabel();
        menuGeneral = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        menuNou = new javax.swing.JMenuItem();
        menuTancar = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        menuEditar = new javax.swing.JMenuItem();
        menuGuardar = new javax.swing.JMenuItem();
        menuEliminar = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        menuBuscar = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("i18n/subsistema1/messagesSubsistema1"); // NOI18N
        setTitle(bundle.getString("client.administracio.title")); // NOI18N

        labelIdentificador.setText("Identificador:");

        labelDocument.setText("Document:");

        labelTipusDocument.setText("Tipus de document:");

        labelNom.setText("Nom:");

        labelCognom1.setText("Cognom 1:");

        labelFuncio.setText("Funció:");

        labelUsuari.setText("Usuari:");

        labelContrasenya.setText("Contrasenya:");

        labelVerificarContrasenya.setText("Verificar contrasenya:");

        labelEmail.setText("Email:");

        labelUniversitat.setText("Universitat:");

        fieldIdentificador.setEnabled(false);

        fieldDocument.setEnabled(false);
        fieldDocument.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fieldDocumentChanged(evt);
            }
        });

        comboDocuments.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N
        comboDocuments.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Sel·leccioneu un tipus de document...", "NIF", "NIE", "Altres" }));
        comboDocuments.setEnabled(false);

        fieldNom.setEnabled(false);
        fieldNom.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fieldNomChanged(evt);
            }
        });

        fieldCognom1.setEnabled(false);
        fieldCognom1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fieldCognom1Changed(evt);
            }
        });

        fieldCognom2.setEnabled(false);
        fieldCognom2.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fieldCognom2Changed(evt);
            }
        });

        comboFuncions.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N
        comboFuncions.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Sel·leccioneu un tipus d'usuari...", "Administrador", "Responsable d'events", "Estudiant" }));
        comboFuncions.setEnabled(false);
        comboFuncions.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                funcioChanged(evt);
            }
        });

        fieldUsuari.setEnabled(false);
        fieldUsuari.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fieldUsuariChanged(evt);
            }
        });

        fieldContrasenya.setEnabled(false);
        fieldContrasenya.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fieldContrasenya1Changed(evt);
            }
        });

        fieldVerificarContrasenya.setEnabled(false);
        fieldVerificarContrasenya.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fieldContrasenya2Changed(evt);
            }
        });

        fieldEmail.setEnabled(false);
        fieldEmail.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fieldMailChanged(evt);
            }
        });

        comboUniversitat.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N
        comboUniversitat.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Sel·leccioneu una universitat..." }));
        comboUniversitat.setEnabled(false);

        checkBloquejat.setText("Bloquejat");
        checkBloquejat.setEnabled(false);
        checkBloquejat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                checkBloquejatActionPerformed(evt);
            }
        });

        checkActiu.setText("Actiu");
        checkActiu.setEnabled(false);
        checkActiu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                checkActiuActionPerformed(evt);
            }
        });

        taulaDates.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N
        taulaDates.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null}
            },
            new String [] {
                "Alta", "Modificació", "Baixa"
            }
        ));
        jScrollPane1.setViewportView(taulaDates);

        tableProvesInscrites.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null}
            },
            new String [] {
                "Prova", "Data", "Realitzada"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane2.setViewportView(tableProvesInscrites);

        labelProvesInscrites.setText("Proves inscrites:");

        labelCognom2.setText("Cognom 2:");

        jMenu1.setText("Arxiu");

        menuNou.setText("Nou usuari");
        menuNou.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nouUsuari(evt);
            }
        });
        jMenu1.add(menuNou);

        menuTancar.setText("Tancar");
        menuTancar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tancarFinestra(evt);
            }
        });
        jMenu1.add(menuTancar);

        menuGeneral.add(jMenu1);

        jMenu2.setText("Editar");

        menuEditar.setText("Editar");
        menuEditar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                editarUsuari(evt);
            }
        });
        jMenu2.add(menuEditar);

        menuGuardar.setText("Guardar");
        menuGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                guardarUsuari(evt);
            }
        });
        jMenu2.add(menuGuardar);

        menuEliminar.setText("Eliminar");
        menuEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                eliminarUsuari(evt);
            }
        });
        jMenu2.add(menuEliminar);

        menuGeneral.add(jMenu2);

        jMenu3.setText("Veure");

        menuBuscar.setText("Buscar");
        menuBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscarUsuari(evt);
            }
        });
        jMenu3.add(menuBuscar);

        menuGeneral.add(jMenu3);

        setJMenuBar(menuGeneral);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(8, 8, 8)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addGroup(layout.createSequentialGroup()
                                    .addComponent(labelNom)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addComponent(fieldCognom1)
                                        .addComponent(fieldNom)
                                        .addComponent(fieldCognom2, javax.swing.GroupLayout.PREFERRED_SIZE, 248, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addGroup(layout.createSequentialGroup()
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(labelTipusDocument)
                                        .addComponent(labelDocument))
                                    .addGap(17, 17, 17)
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(fieldIdentificador, javax.swing.GroupLayout.PREFERRED_SIZE, 248, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                            .addComponent(fieldDocument, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(comboDocuments, javax.swing.GroupLayout.PREFERRED_SIZE, 248, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                            .addComponent(labelCognom1)
                            .addComponent(labelCognom2)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(labelContrasenya)
                                    .addComponent(labelUniversitat)
                                    .addComponent(labelEmail))
                                .addGap(60, 60, 60)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(fieldContrasenya, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(comboUniversitat, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(fieldEmail, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE)))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(labelVerificarContrasenya)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(fieldVerificarContrasenya, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(labelUsuari)
                                    .addComponent(labelFuncio))
                                .addGap(96, 96, 96)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(fieldUsuari, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(comboFuncions, javax.swing.GroupLayout.PREFERRED_SIZE, 252, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(labelIdentificador)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 504, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(checkBloquejat)
                                .addGap(18, 18, 18)
                                .addComponent(checkActiu))
                            .addComponent(labelProvesInscrites))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(15, 15, 15)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelIdentificador)
                            .addComponent(fieldIdentificador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(checkBloquejat)
                            .addComponent(checkActiu))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelDocument)
                            .addComponent(fieldDocument, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelTipusDocument)
                            .addComponent(comboDocuments, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(41, 41, 41)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(fieldNom, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(labelNom))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(fieldCognom1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(labelCognom1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelCognom2)
                            .addComponent(fieldCognom2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(comboFuncions, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(labelFuncio))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelUsuari)
                            .addComponent(fieldUsuari, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(fieldContrasenya, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(labelContrasenya))
                        .addGap(12, 12, 12)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelVerificarContrasenya)
                            .addComponent(fieldVerificarContrasenya, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(12, 12, 12)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelEmail)
                            .addComponent(fieldEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelUniversitat)
                            .addComponent(comboUniversitat, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(labelProvesInscrites)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
                .addGap(0, 13, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
    
    /**
     * Comprova que tots els camps estiguin correctament omplerts<br>
     * En cas d'error, envia un excepció
     */
    private void checkFields() throws EOlympicsException{
        if(fieldDocument.getText().equals("")) throw new EOlympicsException(bundle.getString("client.administracio.error_camp_buit"));
        else if(fieldNom.getText().equals("")) throw new EOlympicsException(bundle.getString("client.administracio.error_camp_buit"));
        else if(fieldCognom1.getText().equals("")) throw new EOlympicsException(bundle.getString("client.administracio.error_camp_buit"));
        else if(fieldCognom2.getText().equals("")) throw new EOlympicsException(bundle.getString("client.administracio.error_camp_buit"));
        else if(fieldUsuari.getText().equals("")) throw new EOlympicsException(bundle.getString("client.administracio.error_camp_buit"));
        else if(fieldContrasenya.getText().equals("")) throw new EOlympicsException(bundle.getString("client.administracio.error_camp_buit"));
        else if(!fieldContrasenya.getText().equals(fieldVerificarContrasenya.getText())) throw new EOlympicsException(bundle.getString("client.administracio.error_contrasenyes_no_iguals"));
        else if(fieldEmail.getText().equals("")) throw new EOlympicsException(bundle.getString("client.administracio.error_camp_buit"));
        else if(comboDocuments.getSelectedIndex()==0) throw new EOlympicsException(bundle.getString("client.administracio.error_no_ha_seleccionat_tipus_document"));
        else if(comboFuncions.getSelectedIndex()==0) throw new EOlympicsException(bundle.getString("client.administracio.error_no_ha_seleccionat_funcio"));
        else if(!checkActiu.isSelected() && !checkBloquejat.isSelected()) throw new EOlympicsException(bundle.getString("client.administracio.error_no_ha_seleccionat_estat"));
        if(comboFuncions.getSelectedIndex()==3){
            if(comboUniversitat.getSelectedIndex()==0) throw new EOlympicsException(bundle.getString("client.administracio.error_no_ha_seleccionat_universitat"));
        }
        Pattern p = Pattern.compile("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");
        Matcher m = p.matcher(fieldEmail.getText());
        if(!m.matches()) throw new EOlympicsException(bundle.getString("client.administracio.error_mail_incorrecte"));
        
        if(comboDocuments.getSelectedIndex()!=3){
            if(!isNifNie(fieldDocument.getText())) throw new EOlympicsException(bundle.getString("client.administracio.error_nif_incorrecte"));
        }
    }
    
    /**
     * Comprova si el string és nif o nie
     * @return true si és nif o nie false altrament
     */
    private boolean isNifNie(String nif){
 
        //si es NIE, eliminar la x,y,z inicial para tratarlo como nif
        if (nif.toUpperCase().startsWith("X")||nif.toUpperCase().startsWith("Y")||nif.toUpperCase().startsWith("Z"))
            nif = nif.substring(1);

        Pattern nifPattern = Pattern.compile("(\\d{1,8})([TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke])");
        Matcher m = nifPattern.matcher(nif);
        if(m.matches()){
            String letra = m.group(2);
            //Extraer letra del NIF
            String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
            int dni = Integer.parseInt(m.group(1));
            dni = dni % 23;
            String reference = letras.substring(dni,dni+1);

            if (reference.equalsIgnoreCase(letra)){
                System.out.println("son iguales. Es NIF. "+letra+" "+reference);
                return true;
            }else{
                System.out.println("NO son iguales. NO es NIF. "+letra+" "+reference);
                return false;
            }                                                                                              
        }
        else
        return false;
    }
    
    /**
     * Comprova els canvis en el CheckBox 'bloquejat' per tal d'evitar que 'actiu' i 'bloquejat'<br>
     * estiguin seleccionats o deshabilitats a la vegada
     * @param evt event que executa l'acció
     */
    private void checkBloquejatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBloquejatActionPerformed
        if(checkBloquejat.isSelected()){
            checkActiu.setSelected(false);
        }else{
            checkActiu.setSelected(true);
        }
    }//GEN-LAST:event_checkBloquejatActionPerformed

    
    /**
     * Comprova els canvis en el CheckBox 'actiu' per tal d'evitar que 'actiu' i 'bloquejat'<br>
     * estiguin seleccionats o deshabilitats a la vegada
     * @param evt event que executa l'acció
     */
    private void checkActiuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkActiuActionPerformed
        if(checkActiu.isSelected()){
            checkBloquejat.setSelected(false);
        }else{
            checkBloquejat.setSelected(true);
        }
    }//GEN-LAST:event_checkActiuActionPerformed

    
    /**
     * Activa la opció de crear un nou usuari
     * @param evt event que executa l'acció
     */
    private void nouUsuari(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nouUsuari
        
        boolean endavant = true;
        if(estat==2  || estat==3)
        {
            int i = JOptionPane.showConfirmDialog(this, bundle.getString("client.administracio.confirmar_comenca_nou_usuari"), 
                bundle.getString("client.titol_alerta_client"), JOptionPane.WARNING_MESSAGE);
            System.out.println("Boto apretat: "+i);
            if(i!=0) endavant = false;
        } 
        
        if(endavant){
            usuari = new Usuari();
            clearAll();
            enableAll();

            estat = 3;
            updateMenusWithState();
        }
    }//GEN-LAST:event_nouUsuari

    /**
     * Tanca la finestra
     * @param evt event que executa l'acció
     */
    private void tancarFinestra(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tancarFinestra
        boolean endavant = true;
        if(estat==2 || estat==3)
        {
            int i = JOptionPane.showConfirmDialog(this, bundle.getString("client.administracio.confirmar_tancar_administracio"), 
                bundle.getString("client.titol_alerta_client"), JOptionPane.WARNING_MESSAGE);
            System.out.println("Boto apretat: "+i);
            if(i!=0) endavant = false;
        }
        if(endavant) this.dispose();
    }//GEN-LAST:event_tancarFinestra

    /**
     * Activa la opció d'editar l'usuari seleccionat
     * @param evt event que executa l'acció
     */
    private void editarUsuari(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editarUsuari
        enableAll();
        estat = 2;
        updateMenusWithState();
    }//GEN-LAST:event_editarUsuari

    /**
     * Activa la opció de guardar l'usuari seleccionat
     * @param evt event que executa l'acció
     */
    private void guardarUsuari(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guardarUsuari
            
        boolean endavant = true;
        if(estat==2 || estat==3)
        {
            String missatge = "";
            if(estat==2) missatge = bundle.getString("client.administracio.confirmar_guardar_editant");
            else if(estat==3) missatge = bundle.getString("client.administracio.confirmar_guardar_nou");
            int i = JOptionPane.showConfirmDialog(this, missatge, 
                bundle.getString("client.titol_alerta_client"), JOptionPane.WARNING_MESSAGE);
            System.out.println("Boto apretat: "+i);
            if(i!=0) endavant = false;
        }
        if(!endavant) return;
            
        System.out.println("\nGuardan usuari...");
        try{
                checkFields();
                
                Integer idInternNou = new Integer(0);
                
                String tipusUsuari = comboFuncions.getSelectedItem().toString();
                
                String tipusDocument = "";
                if(comboDocuments.getSelectedIndex()==1){
                    tipusDocument = "NIF";
                }else if(comboDocuments.getSelectedIndex()==2){
                    tipusDocument = "NIE";
                }else if(comboDocuments.getSelectedIndex()==3){
                    tipusDocument = "ALT";
                }
                comboDocuments.getSelectedItem().toString();
                String universitat = comboUniversitat.getSelectedItem().toString();
    
                boolean actiu = checkActiu.isSelected();
                boolean isBaixa = false;
                char actiuStr = 'A';
                
                if(!actiu) { 
                    actiuStr = 'B';   
                    if(!usuari.getEstatEnSistema().equalsIgnoreCase("B")){
                        isBaixa = true;
                    }
                }
                
                if(estat==3){
                    if(tipusUsuari.charAt(0) =='A'){
                        idInternNou = remoto.sub1addUser(administrador.getIdAdministrador(), tipusUsuari.charAt(0), fieldUsuari.getText(), fieldContrasenya.getText(), fieldEmail.getText(), actiuStr, tipusDocument, fieldDocument.getText(), fieldNom.getText(), fieldCognom1.getText(), fieldCognom2.getText(), null);
                    }else if(tipusUsuari.charAt(0)=='R'){
                        idInternNou = remoto.sub1addUser(administrador.getIdAdministrador(), tipusUsuari.charAt(0), fieldUsuari.getText(), fieldContrasenya.getText(), fieldEmail.getText(), actiuStr, tipusDocument, fieldDocument.getText(), fieldNom.getText(), fieldCognom1.getText(), fieldCognom2.getText(), null);
                    }else if(tipusUsuari.charAt(0)=='E'){
                        idInternNou = remoto.sub1addUser(administrador.getIdAdministrador(), tipusUsuari.charAt(0), fieldUsuari.getText(), fieldContrasenya.getText(), fieldEmail.getText(), actiuStr, tipusDocument, fieldDocument.getText(), fieldNom.getText(), fieldCognom1.getText(), fieldCognom2.getText(), universitat);
                    }
                }else if(estat==2){
                    boolean totOk = false;
                    
                    
                    if(tipusUsuari.charAt(0) =='A'){
                        totOk = remoto.sub1updateUser(administrador.getIdAdministrador(), Integer.parseInt(fieldIdentificador.getText()), tipusUsuari.charAt(0), fieldUsuari.getText(), fieldContrasenya.getText(), fieldEmail.getText(), actiuStr, tipusDocument, fieldDocument.getText(), fieldNom.getText(), fieldCognom1.getText(), fieldCognom2.getText(), null, isBaixa);
                    }else if(tipusUsuari.charAt(0)=='R'){
                        totOk = remoto.sub1updateUser(administrador.getIdAdministrador(), Integer.parseInt(fieldIdentificador.getText()), tipusUsuari.charAt(0), fieldUsuari.getText(), fieldContrasenya.getText(), fieldEmail.getText(), actiuStr, tipusDocument, fieldDocument.getText(), fieldNom.getText(), fieldCognom1.getText(), fieldCognom2.getText(), null, isBaixa);
                    }else if(tipusUsuari.charAt(0)=='E'){
                        totOk = remoto.sub1updateUser(administrador.getIdAdministrador(), Integer.parseInt(fieldIdentificador.getText()), tipusUsuari.charAt(0), fieldUsuari.getText(), fieldContrasenya.getText(), fieldEmail.getText(), actiuStr, tipusDocument, fieldDocument.getText(), fieldNom.getText(), fieldCognom1.getText(), fieldCognom2.getText(), universitat, isBaixa);
                    }
                    
                    if(totOk) idInternNou = new Integer(Integer.parseInt(fieldIdentificador.getText()));
                    else idInternNou = new Integer(0);
                }
                
                System.out.println("Id inserted: "+idInternNou);
                if(idInternNou.intValue() == 0) throw new EOlympicsException(bundle.getString("client.administracio.error_guardar_usuari"));
                
                usuari = remoto.sub1getUser(idInternNou.intValue());
                if(usuari==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                
                inscripcions = remoto.sub1getInscripcions(idInternNou.intValue());
                if(inscripcions==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                proves = remoto.sub1getProves(idInternNou.intValue());
                if(proves==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                rondes = remoto.sub1getRondes(idInternNou.intValue());
                if(rondes==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                participacions = remoto.sub1getParticipacions(idInternNou.intValue());
                if(participacions==null) throw new EOlympicsException(bundle.getString("client.administracio.error_get_user"));
                
                fillFormWithCurrentUser();
                
                
                disableAll();
                estat = 1;
                updateMenusWithState();
                
        }catch (EOlympicsException e) {
                System.out.println("EOlympicsException");
                JOptionPane.showMessageDialog(rootPane, e.getMessage(),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (RemoteException e) {
                System.out.println("Remote Exception");
                JOptionPane.showMessageDialog(rootPane, bundle.getString("client.error_rmi"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (Exception e){
                System.out.println("Exception");
                JOptionPane.showMessageDialog(rootPane, bundle.getString("client.administracio.error_guardar_usuari"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }
    }//GEN-LAST:event_guardarUsuari

    /**
     * Obra la pantalla de búsqueda d'usuaris
     * @param evt event que executa l'acció
     */
    private void buscarUsuari(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscarUsuari
        pantallaBusqueda = new PantallaBusquedaUsuarios(remoto, this);
        pantallaBusqueda.setVisible(true);
        
    }//GEN-LAST:event_buscarUsuari

    /**
     * Elimina l'usuari seleccionat
     * @param evt event que executa l'acció
     */
    private void eliminarUsuari(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eliminarUsuari
            
        boolean endavant = true;
        String missatge = bundle.getString("client.administracio.confirmar_eliminar_usuari");
        int i = JOptionPane.showConfirmDialog(this, missatge, 
            bundle.getString("client.titol_alerta_client"), JOptionPane.WARNING_MESSAGE);
        System.out.println("Boto apretat: "+i);
        if(i!=0) return;
            
        System.out.println("\nEliminant usuari...");
        try{
                if(!inscripcions.isEmpty()) throw new EOlympicsException(bundle.getString("client.administracio.error_borrar_usuari_amb_inscripcions"));
            
                boolean totOk = remoto.sub1deleteUser(usuari.getIdIntern().intValue(),usuari.getTipusUsuari().charAt(0));
                
                if(!totOk) throw new EOlympicsException(bundle.getString("client.administracio.error_eliminar_usuari"));
                
                usuari = null;

                clearAll();
                disableAll();
                estat = 0;
                updateMenusWithState();
                
        }catch (EOlympicsException e) {
                System.out.println("EOlympicsException");
                JOptionPane.showMessageDialog(rootPane, e.getMessage(),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (RemoteException e) {
                System.out.println("Remote Exception");
                JOptionPane.showMessageDialog(rootPane, bundle.getString("client.error_rmi"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (Exception e){
                System.out.println("Exception");
                JOptionPane.showMessageDialog(rootPane, bundle.getString("client.administracio.error_eliminar_usuari"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }
        
        
    }//GEN-LAST:event_eliminarUsuari

    /**
     * S'activa quan canvia el valor seleccionat del ComboBox de funcions<br>
     * S'utilitza per habilitar o deshabilitar el ComboBox d'Universitats
     * @param evt event que executa l'acció
     */
    private void funcioChanged(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_funcioChanged
        checkUniversitatsEnabled();
    }//GEN-LAST:event_funcioChanged

    /**
     * Comprova la longitud del camp document, perquè no sigui superior a 16
     * @param evt event que executa l'acció
     */
    private void fieldDocumentChanged(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fieldDocumentChanged
        String document = fieldDocument.getText();
        if(document.length()>15) fieldDocument.setText(document.substring(0, 15));
    }//GEN-LAST:event_fieldDocumentChanged

    /**
     * Comprova la longitud del camp nom, perquè no sigui superior a 32
     * @param evt event que executa l'acció
     */
    private void fieldNomChanged(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fieldNomChanged
        String document = fieldNom.getText();
        if(document.length()>31) fieldNom.setText(document.substring(0, 31));
    }//GEN-LAST:event_fieldNomChanged

    /**
     * Comprova la longitud del camp cognom1, perquè no sigui superior a 32
     * @param evt event que executa l'acció
     */
    private void fieldCognom1Changed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fieldCognom1Changed
        String document = fieldCognom1.getText();
        if(document.length()>31) fieldCognom1.setText(document.substring(0, 31));
    }//GEN-LAST:event_fieldCognom1Changed

    /**
     * Comprova la longitud del camp cognom2, perquè no sigui superior a 32
     * @param evt event que executa l'acció
     */
    private void fieldCognom2Changed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fieldCognom2Changed
        String document = fieldCognom2.getText();
        if(document.length()>31) fieldCognom2.setText(document.substring(0, 31));
    }//GEN-LAST:event_fieldCognom2Changed

    /**
     * Comprova la longitud del camp idUsuari, perquè no sigui superior a 16
     * @param evt event que executa l'acció
     */
    private void fieldUsuariChanged(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fieldUsuariChanged
        String document = fieldUsuari.getText();
        if(document.length()>15) fieldUsuari.setText(document.substring(0, 15));
    }//GEN-LAST:event_fieldUsuariChanged

    /**
     * Comprova la longitud del camp contrasenya1, perquè no sigui superior a 16
     * @param evt event que executa l'acció
     */
    private void fieldContrasenya1Changed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fieldContrasenya1Changed
        String document = fieldContrasenya.getText();
        if(document.length()>15) fieldContrasenya.setText(document.substring(0, 15));
    }//GEN-LAST:event_fieldContrasenya1Changed

    /**
     * Comprova la longitud del camp contrasenya2, perquè no sigui superior a 16
     * @param evt event que executa l'acció
     */
    private void fieldContrasenya2Changed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fieldContrasenya2Changed
        String document = fieldVerificarContrasenya.getText();
        if(document.length()>15) fieldVerificarContrasenya.setText(document.substring(0, 15));
    }//GEN-LAST:event_fieldContrasenya2Changed

    /**
     * Comprova la longitud del camp mail, perquè no sigui superior a 16
     * @param evt event que executa l'acció
     */
    private void fieldMailChanged(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fieldMailChanged
        String document = fieldEmail.getText();
        if(document.length()>63) fieldEmail.setText(document.substring(0, 63));
    }//GEN-LAST:event_fieldMailChanged

    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JCheckBox checkActiu;
    private javax.swing.JCheckBox checkBloquejat;
    private javax.swing.JComboBox comboDocuments;
    private javax.swing.JComboBox comboFuncions;
    private javax.swing.JComboBox comboUniversitat;
    private javax.swing.JTextField fieldCognom1;
    private javax.swing.JTextField fieldCognom2;
    private javax.swing.JTextField fieldContrasenya;
    private javax.swing.JTextField fieldDocument;
    private javax.swing.JTextField fieldEmail;
    private javax.swing.JTextField fieldIdentificador;
    private javax.swing.JTextField fieldNom;
    private javax.swing.JTextField fieldUsuari;
    private javax.swing.JTextField fieldVerificarContrasenya;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JLabel labelCognom1;
    private javax.swing.JLabel labelCognom2;
    private javax.swing.JLabel labelContrasenya;
    private javax.swing.JLabel labelDocument;
    private javax.swing.JLabel labelEmail;
    private javax.swing.JLabel labelFuncio;
    private javax.swing.JLabel labelIdentificador;
    private javax.swing.JLabel labelNom;
    private javax.swing.JLabel labelProvesInscrites;
    private javax.swing.JLabel labelTipusDocument;
    private javax.swing.JLabel labelUniversitat;
    private javax.swing.JLabel labelUsuari;
    private javax.swing.JLabel labelVerificarContrasenya;
    private javax.swing.JMenuItem menuBuscar;
    private javax.swing.JMenuItem menuEditar;
    private javax.swing.JMenuItem menuEliminar;
    private javax.swing.JMenuBar menuGeneral;
    private javax.swing.JMenuItem menuGuardar;
    private javax.swing.JMenuItem menuNou;
    private javax.swing.JMenuItem menuTancar;
    private javax.swing.JTable tableProvesInscrites;
    private javax.swing.JTable taulaDates;
    // End of variables declaration//GEN-END:variables
}
